﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects.DataClasses;
using Dominio.Entidades;
using Dominio.Logica;
using Dominio.Logger;

namespace Interfaz
{
    public partial class ABMRoles : Form
    {
        private List<Funcionalidades> ListaFuncionalidades;

        private List<Funcionalidades> ListaFuncionalidadesRol;

        private List<Funcionalidades> ListaFuncionalidadesNoRol;

        private AgenciaEntities ContextoBD;

        private bool HuboCambios = false;

        public ABMRoles()
        {
            InitializeComponent();
        }

        private void ABMRoles_Load(object sender, EventArgs e)
        {
            cmbRoles.DataSource = Roles.RecuperarRolesSistema();
            CargarFuncionalidades();
            ContextoBD = Contexto.GetContexto();
            lblCantFuncAsig.Text = ListaFuncionalidadesRol.Count.ToString();
            lblCantFuncRest.Text = ListaFuncionalidadesNoRol.Count.ToString();
        }

        private void CargarFuncionalidades()
        {
            Roles Rol = (Roles)cmbRoles.SelectedItem;
            ListaFuncionalidades = Funcionalidades.FuncionalidadesSistema();
            ListaFuncionalidadesRol = Funcionalidades.FuncionalidadesPorRol(Rol);
            ListaFuncionalidadesNoRol = Funcionalidades.FuncionalidadesNoRol(Rol);

            RefrescarListas();
        }

        private void RefrescarListas()
        {
            lstFuncionalidades.DataSource = null;
            lstFuncionalidadesRol.DataSource = null;
            lstFuncionalidades.DataSource = ListaFuncionalidadesNoRol;
            lstFuncionalidadesRol.DataSource = ListaFuncionalidadesRol;
            lblCantFuncAsig.Text = ListaFuncionalidadesRol.Count.ToString();
            lblCantFuncRest.Text = ListaFuncionalidadesNoRol.Count.ToString();
        }

        private void cmbRoles_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargarFuncionalidades();

        }

        #region BotonesListas
        private void btnAgregar_Click(object sender, EventArgs e)
        {
            Funcionalidades Funcionalidad = (Funcionalidades)lstFuncionalidades.SelectedItem;
            if (!(Funcionalidad == null))
            {
                ListaFuncionalidadesNoRol.Remove(Funcionalidad);
                ListaFuncionalidadesRol.Add(Funcionalidad);
                RefrescarListas();
                HuboCambios = true;
            }

        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            Funcionalidades Funcionalidad = (Funcionalidades)lstFuncionalidadesRol.SelectedItem;
            if (!(Funcionalidad == null))
            {
                ListaFuncionalidadesRol.Remove(Funcionalidad);
                ListaFuncionalidadesNoRol.Add(Funcionalidad);
                RefrescarListas();
                HuboCambios = true;
            }
        }
        #endregion

        #region BotonesAceptarCancelar
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (HuboCambios)
            {
                GuardarCambios();
                ManejadorLog.GetLog().Grabar("OK: Se ha modificado los roles correctamente, acción realizada por el usuario: " + Agencia.GetAgencia().UsuarioLogueado);
                MessageBox.Show("Se han guardado los cambios", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }
        #endregion

        private void GuardarCambios()
        {
            Roles Rol = (Roles)cmbRoles.SelectedItem;

            List<Funcionalidades> ListaFuncionalidadesRolBD = Funcionalidades.FuncionalidadesPorRol(Rol);
            List<Funcionalidades> ListaFuncionalidadesAgregar =
                (from o in ListaFuncionalidadesRol where (!ListaFuncionalidadesRolBD.Contains(o)) select o).ToList();
            List<Funcionalidades> ListaFuncionalidadesQuitar =
                (from o in ListaFuncionalidadesRolBD where (!ListaFuncionalidadesRol.Contains(o)) select o).ToList();

            foreach (Funcionalidades FuncionalidadAgregar in ListaFuncionalidadesAgregar)
            {
                RolFuncionalidad RolFuncionalidad = new RolFuncionalidad();
                RolFuncionalidad.Roles = Rol;
                RolFuncionalidad.Funcionalidades = FuncionalidadAgregar;
                RolFuncionalidad.AgregarRolFuncionalidad();
            }

            foreach (Funcionalidades FuncionalidadQuitar in ListaFuncionalidadesQuitar)
            {
                RolFuncionalidad RolFuncionalidadBorrar = RolFuncionalidad.BuscarPorIdRolIdFuncionalidad(Rol, FuncionalidadQuitar.IdFuncionalidad);
                RolFuncionalidadBorrar.BorrarRolFuncionalidad();
            }

            ContextoBD.SaveChanges();
        }
    }
}
